#define _CRT_SECURE_NO_WARNINGS 1


//void Swap(int* px, int* py)
//{
//	int tmp = *px;
//	*px = *py;
//	*py = tmp;
//}
//
//void AdjustDown(int* a, int n, int parent)
//{
//	int child = parent * 2 + 1;
//
//	while (child < n)
//	{
//		if ((child + 1 < n) && (a[child + 1] > a[child]))
//		{
//			child++;
//		}
//
//		if (a[child] > a[parent])
//		{
//			Swap(&a[child], &a[parent]);
//			parent = child;
//			child = parent * 2 + 1;
//		}
//		else
//		{
//			break;
//		}
//	}
//}
//
//void HeapSort(int* a, int n)
//{
//	int i = 0;
//
//	for (i = (n - 1 - 1) / 2; i >= 0; i--)
//	{
//		AdjustDown(a, n, i);
//	}
//
//	Swap(&a[0], &a[n - 1]);
//	n--;
//
//	while (n > 0)
//	{
//		AdjustDown(a, n, 0);
//		Swap(&a[0], &a[n - 1]);
//		n--;
//	}
//}


//#include <stdio.h>
//
//void CreateNDate()
//{
//	//造数据
//	int n = 10000;
//	srand(time(0));
//	const char* file = "data.txt";
//	FILE* fin = fopen(file, "w");
//	
//	if (fin == NULL)
//	{
//		perror("fopen error");
//		return;
//	}
//
//	for (size_t i = 0; i < n; ++i)
//	{
//		int x = rand() % 1000000;
//		fprintf(fin, "%d\n", x);
//	}
//
//	fclose(fin);
//}
//
//void Swap(int* px, int* py)
//{
//	int tmp = *px;
//	*px = *py;
//	*py = tmp;
//}
//
//void AdjustDown(int* a, int n, int parent)
//{
//	int child = 2 * parent + 1;
//
//	while (child < n)
//	{
//		if ((child + 1 < n) && (a[child + 1] < a[child]))
//		{
//			child++;
//		}
//
//		if (a[child] < a[parent])
//		{
//			Swap(&a[child], &a[parent]);
//			parent = child;
//			child = parent * 2 + 1;
//		}
//		else
//		{
//			break;
//		}
//	}
//}
//
//void PrintTopK(int k)
//{
//	FILE* fout = fopen("data.txt", "r");
//
//	if (NULL == fout)
//	{
//		perror("fopen error");
//		return;
//	}
//
//	int* a = (int*)malloc(sizeof(int) * k);
//
//	for (int i = 0; i < k; i++)
//	{
//		fscanf(fout, "%d", &a[i]);
//	}
//
//	for (int i = (k - 1 - 1) / 2; i >= 0; i--)
//	{
//		AdjustDown(a, k, i);
//	}
//
//	int x = 0;
//
//	while (fscanf(fout, "%d", &x) != EOF)
//	{
//		if (x > a[0])
//		{
//			a[0] = x;
//			AdjustDown(a, k, 0);
//		}
//	}
//
//	for (int i = 0; i < k; i++)
//	{
//		printf("%d ", a[i]);
//	}
//
//	fclose(fout);
//	free(a);
//	a = NULL;
//}


//int maxDepth(struct TreeNode* root)
//{
//	if (NULL == root)
//	{
//		return 0;
//	}
//
//	int leftDepth = maxDepth(root->left);
//	int rightDepth = maxDepth(root->right);
//
//	return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
//}


bool isUnivalTree(struct TreeNode* root)
{
	if (NULL == root)
	{
		return true;
	}

	if (root->left && (root->val != root->left->val))
	{
		return false;
	}

	if (root->right && (root->val != root->right->val))
	{
		return false;
	}

	return isUnivalTree(root->left) && isUnivalTree(root->right);
}